package com.mvc;

import com.Config;
import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;
import com.spring.context.impl.AbstractApplicationContext;
import com.spring.context.impl.AnnotationApplicationContext;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import java.io.*;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;


/**
 * 用来启动 spring 容器 和 mvc容器
 *
 * 只需要在 web.xml 中配一个listener 就可以了,其他servlet 都可以不用配置
 */

@Slf4j
public class ContextListener implements ServletContextListener {
	private AbstractApplicationContext ac;
	
	@Override
	public void contextInitialized(ServletContextEvent sce) {
		log.info("tomcat已完成初始化,开始准备ioc");
		// 创建容器
		ac = new AnnotationApplicationContext(Config.class);
		
		// 放进tomcat 全局属性里面，方面后面的mvc获得spring容器 ,暂时没有什么作用,mvc 直接构造函数中持有ioc容器，没有从tomcat获得
		ServletContext servletContext = sce.getServletContext();
		servletContext.setAttribute("applicationContext", ac);
		
		// 创建mvc容器，初始化url映射
		MvcApplicationContext mvcApplicationContext = new MvcApplicationContext(ac, servletContext.getContextPath());
		
		// 创建DispatchServlet , mvc容器 被 DispatchServlet 持有
		DispatchServlet dispatchServlet = new DispatchServlet();
		dispatchServlet.setMvc(mvcApplicationContext);
		
		// 注册 DispatchServlet
		ServletRegistration.Dynamic dynamic = servletContext.addServlet("dispatchServlet", dispatchServlet);
		dynamic.addMapping("*.do");
		
		// 单个文件上限 2M
		long maxFileSize = 2 * 1024 * 1024;
		// 请求数据大小 3M
		long maxRequestSize = 3 * 1024 * 1024;
		// 缓存  3M
		int fileSizeThreshold = 3 * 1024 * 1024;
		MultipartConfigElement multipartConfigElement = new MultipartConfigElement("", maxFileSize, maxRequestSize, fileSizeThreshold);
		dynamic.setMultipartConfig(multipartConfigElement);
		
		log.info("mvc 已准备完毕");
		
		
		// 输出下banner
		try {
			BufferedReader reader =
					new BufferedReader(new InputStreamReader(ContextListener.class.getClassLoader().getResourceAsStream("banner.txt")));
			String line = null;
			while ((line = reader.readLine()) != null){
				System.out.println(line);
			}
		} catch (IOException e) {
			// ignore
			log.info("banner.txt 文件没有找到");
		}
	}
	
	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		// log.info("准备关闭容器...");        // log.info 无法显示到控制台
		ac.close();
		// log.info("已调用完容器关闭方法");
		System.out.println("已调用完容器关闭方法");
		
		
		Enumeration<Driver> drivers = DriverManager.getDrivers();
		while (drivers.hasMoreElements()) {
			Driver driver = drivers.nextElement();
			try {
				DriverManager.deregisterDriver(driver);
				System.out.println("卸载驱动 " + driver.toString() + " 成功");
			} catch (SQLException e) {
				System.out.println("卸载驱动 " + driver.toString() + " 失败");
			}
		}
		
		// 我也不知道干嘛的
		AbandonedConnectionCleanupThread.checkedShutdown();
	}
}
